1

- 我不使用的关键字

  • 我不用 goto

    goto 会让代码执行逻辑难以阅读和理解。

    另外还可以使用 label 标记来组织代码

    func main() {
    outer:
        for {
            log.Println("outer")
            for {
                log.Println("inner")
                break outer
            }
        }
    }
  • 我不用 fallthrough

    golang 的 switch 足够好用,不需要用 fallthrough 退化到其他语言的模式。

  • 我不用 else

    大部分的 else 可以用反转判断来实现。例如:

    if something.OK() {
        something.Lock()
        defer something.Unlock()
        err := something.Do()
        if err == nil {
                stop := StartTimer()
                defer stop()
                log.Println("working...")
                doWork(something)
                <-something.Done() // wait for it
                log.Println("finished")
                return nil
        } else {
                return err
        }
    } else {
        return errors.New("something not ok")
    }
    
    //
    // *守护式编程*
    // 上面的代码可以用反转判断来优化。
    if !something.OK() {  // flipped
        return errors.New("something not ok")
    }
    something.Lock()
    defer something.Unlock()
    err := something.Do()
    if err != nil {       // flipped
        return err
    }
    stop := StartTimer()
    defer stop()
    log.Println("working...")
    doWork(something)
    <-something.Done() // wait for it
    log.Println("finished")
    return nil

Airy
2.4k 声望69 粉丝

github.com/airylinus